package com.koala.learn.datelearn;


import cn.hutool.core.date.DatePattern;
import org.junit.jupiter.api.Test;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;

import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;

/**
 * @author yantingrui
 * @date 2021/12/3   9:44
 */
public class LocalDateTimeLearn {


    /**
     * 12.1.1 使用LocalDate和LocalTime
     *
     * @time 2021/7/19 11:30
     */

    @Test
    public void test30() {
        final LocalDateTime now = LocalDateTime.now();
        final String format = now.format(DatePattern.CHINESE_DATE_TIME_FORMATTER);
        System.out.println(format);
    }

    @Test
    public void test1() {
        LocalDate of = LocalDate.of(2021, 1, 1);
        int year = of.getYear();
        Month month = of.getMonth();
        int dayOfMonth = of.getDayOfMonth();
        DayOfWeek dayOfWeek = of.getDayOfWeek();
        int i = of.lengthOfMonth();

        of.get(ChronoField.YEAR);

        LocalDate now = LocalDate.now();
        System.out.println(now);

        // localtime
        LocalTime time = LocalTime.of(18, 12, 10);
        int day = time.get(ChronoField.SECOND_OF_DAY);
        LocalTime timestr = LocalTime.parse("20:10:10");
        System.out.println(time);
    }


    /**
     *  12.1.2 合并日期和时间
     * @time  2021/7/19 11:30
     */
    @Test
    public void test3(){
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);
    }

    /**
     * 12.1.3
     * @time  2021/7/19 11:30
     */
    @Test
    public void test4(){
        Instant instant = Instant.ofEpochSecond(3,1_000_000_000);
        Instant.ofEpochMilli(50000);

    }

    /**
     * 12.1.4 定义Duration或Period     后者更偏向于时间
     * @time  2021/7/19 11:30
     */
    @Test
    public void test5(){
        Duration between = Duration.between(LocalTime.of(10, 1, 12), LocalTime.of(12, 12, 12));
        System.out.println(between.toHours());
    }


    /**
     * 12.2 操纵、解析和格式化日期
     * 如果你已经有一个LocalDate对象，想要创建它的一个修改版，最直接也最简单的方法是使用withAttribute方法。withAttribute方法会创建对象的一个副本，并按照需要修改它的属性。
     * @time  2021/7/19 11:30
     */
    @Test
    public void test6(){

        // 直接设置
        LocalDate date = LocalDate.of(2014, 12, 10);
        LocalDate localDate = date.withYear(2005);
        LocalDate localDate1 = date.withDayOfMonth(10);
        LocalDate with = date.with(ChronoField.MONTH_OF_YEAR, 8);

        // 在原来的基础上添加
        LocalDate localDate2 = date.plusDays(10);
        LocalDate localDate3 = date.minusYears(10);
    }

    /**
     * 12.2.1 使用TemporalAdjuster
     * 截至目前，你所看到的所有日期操作都是相对比较直接的。有的时候，你需要进行一些更加复杂的操作，
     * 比如，将日期调整到下个周日、下个工作日，或者是本月的最后一天。这时，你可以使用重载版本的with方法，
     * 向其传递一个提供了更多定制化选择的TemporalAdjuster对象，更加灵活地处理日期。
     * @time  2021/7/19 11:30
     */
    @Test
    public void test7(){
//        TemporalAdjuster
        LocalDate date = LocalDate.of(2021, 5, 21);
        LocalDate with = date.with(DayOfWeek.SUNDAY);
        //package java.time.temporal;
        LocalDate with1 = date.with(lastDayOfMonth());
    }


    /**
     * 12.2.2 打印输出及解析日期-时间对象
     * 处理日期和时间对象时，格式化以及解析日期-时间对象是另一个非常重要的功能。新的java.time.format包就是特别为这个目的而设计的。
     * @time  2021/7/19 11:30
     */
    @Test
    public void test8() {
//        final String normDatetimeMsPattern = DatePattern.NORM_DATETIME_MS_PATTERN;
        LocalDate date = LocalDate.parse("20140305", DateTimeFormatter.BASIC_ISO_DATE);
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("DatePattern.NORM_DATETIME_MS_PATTERN");
        String format = date.format(dateTimeFormatter);
        System.out.println(format);
        LocalDate parse = LocalDate.parse(format, dateTimeFormatter);
        System.out.println(parse);
    }

    /**
     * 12.3 处理不同的时区和历法
     * 之前你看到的日期和时间的种类都不包含时区信息。时区的处理是新版日期和时间API新增加的重要功能，使用新版日期和时间API时区的处理被极大地简化了
     * @time  2021/7/19 11:30
     */
    @Test
    public void test9(){
        LocalDate date = LocalDate.of(2014, Month.MARCH, 10);
        ZoneId zoneId = TimeZone.getDefault().toZoneId();
        ZonedDateTime zonedDateTime = date.atStartOfDay(zoneId);
        System.out.println(zonedDateTime);
        //利用和UTC/格林尼治时间的固定偏差计算时区
        LocalDateTime dateTime = LocalDateTime.of(2014, 10, 10, 12, 10);
        ZoneOffset zs = ZoneOffset.of("-05:00");
        OffsetDateTime of1 = OffsetDateTime.of(dateTime, zs);
        System.out.println(of1);

    }

    @Test
    public void test10() throws InterruptedException {
        LocalTime l1 = LocalTime.now();
        System.out.println(l1);
        TimeUnit.SECONDS.sleep(5);
        LocalTime l2 = LocalTime.now();
        l1.withSecond(l2.getSecond());
        l1.withNano(l2.getNano());
        System.out.println(l1);
//        log.info("修改后的l1:{}",l2);
    }
}
